// 用户相关接口
const {Router} = require('express');
const router = Router();
const fs = require('fs');
const query = require('../utils/query');
const md5 = require('md5');


const {createUpload, parseFilePath} = require('../utils/file');
const {check, checkManager} = require('../utils/valitate');
const {sign} = require('../utils/jwt');
const {verifyToken} = require("../utils/valitate");
const {loginLog} = require("../utils/log");
// 导入upload中间件创建器，生成文件处理中间件
const upload = createUpload('public/upload/avatar');

// 注册接口
// 数据库不能存储文件，数据库中存储的是文件的保存路径
router.post(
    '/register',
    upload.single('avatar'),    // 解析formData并保存文件
    check([], ['username', 'password', 'account']), // 校验参数
    async (req, res) => {
        // 使用try catch捕获可能发生的错误
        try {
            // 校验头像是否上传
            if (!req.file) {
                return res.send({
                    code: 0,
                    msg: '请上传头像'
                });
            }
            // 解构出参数
            let {username, password, account} = req.body;
            // 将密码进行加密
            password = md5(password);
            // 重名的校验，获取数据库的查询结果
            const data = await query(
                "SELECT Id FROM user WHERE account=? OR user_name=?",
                [account, username]
            );
            // 如果查询出数据的长度不为0，说明有重名的
            if (data.length !== 0) {
                // 删除上传的图片
                fs.unlinkSync(req.file.path);
                // 响应
                res.send({
                    code: 0,
                    msg: '账号或用户名重复'
                });
                // 终止后续代码执行
                return;
            }
            // 执行插入操作
            await query(
                `INSERT INTO user (user_name,password,avatar,account) VALUES (?,?,?,?)`,
                [username, password, req.file.path, account]
            );
            // 上面的那句sql执行成功，才会走到这
            res.send({
                code: 1,
                msg: '注册成功'
            });
        } catch (err) {
            res.send({
                code: 0,
                msg: '注册失败',
                err
            })
        }
    }
);


// 完成登录接口
router.post(
    '/login',
    check([], ['password', 'account']), // 校验参数
    async (req, res) => {
        // 1、查询数据库账号密码是否匹配
        // 查询数据库中是否拥有账号和密码都和登录时输入的信息一致的数据
        let {account, password} = req.body;
        // 因为数据库中存储的密码为加密的，因此对比也需要进行加密
        password = md5(password);
        // 拼接sql，不查询用户的密码
        let data = await query(
            `SELECT Id,user_name,avatar,account,type FROM user WHERE account=? AND password=?`,
            [account, password]
        );
        // 2、根据查询结果数组的长度判断是否匹配
        if (data.length === 0) {
            res.send({
                code: 0,
                msg: '账号或密码错误'
            });
        } else {
            // 登录成功
            data = data[0];
            data.avatar = parseFilePath(data.avatar);
            const token = sign(data,{expiresIn: '1days'});

            // 将token存储到客户端的cookie中
            res.cookie('authorization', token, {
                maxAge: 1 * 24 * 60 * 60 * 1000
            });

            res.send({
                code: 1,
                msg: '登录成功',
                data: {
                    ...data,
                    token
                }
            });
            // 写入日志
            loginLog(data.Id);
        }
    }
)

router.use(verifyToken);

router.get(
    '/userInfo',
    function(req,res){
        res.json(req.userInfoLaoGuo)
    }
)

router.route('/')
    .get(
        checkManager,
        check(['pageIndex', 'pageSize'], []),
        async function (req, res) {
            const {pageIndex, pageSize} = req.query;
            const data = await query(
                `SELECT SQL_CALC_FOUND_ROWS Id,user_name,type,avatar,account FROM user WHERE type=? LIMIT ?,?`,
                ['0', (pageIndex - 1) * pageSize, pageSize * 1]
            );
            data.forEach(user => user.avatar = parseFilePath(user.avatar));
            const total = await query(`SELECT FOUND_ROWS() AS total;`);
            query.reCon();
            res.send({
                code: 1,
                msg: '获取成功',
                data,
                total: total[0].total,
                index: Number(pageIndex),
                size: Number(pageSize)
            });
        }
    )
    .post(
        upload.single('avatar'),    // 解析formData并保存文件
        check([], ['username', 'password', 'account', 'type']), // 校验参数
        async function (req, res) {
            try {
                if (!req.file) {
                    return res.send({
                        code: 0,
                        msg: '请上传头像'
                    });
                }
                // 解构出参数
                let {username, password, account, type} = req.body;
                // 将密码进行加密
                password = md5(password);
                // 重名的校验，获取数据库的查询结果
                const data = await query(
                    `SELECT Id FROM user WHERE account=? OR user_name=?`,
                    [account, username]
                );
                // 如果查询出数据的长度不为0，说明有重名的
                if (data.length !== 0) {
                    // 删除上传的图片
                    fs.unlinkSync(req.file.path);
                    // 响应
                    res.send({
                        code: 0,
                        msg: '账号或用户名重复'
                    });
                    // 终止后续代码执行
                    return;
                }
                // 执行插入操作
                await query(
                    `INSERT INTO user (user_name,password,avatar,account,type) VALUES (?,?,?,?,?)`,
                    [username, password, req.file.path, account, type]
                );
                // 上面的那句sql执行成功，才会走到这
                res.send({
                    code: 1,
                    msg: '添加成功'
                });
            } catch (err) {
                res.send({
                    code: 0,
                    msg: '添加失败',
                    err
                })
            }
        }
    )
    .put(
        upload.single('avatar'),   // 存储文件
        check(['id']),
        async function (req, res) {
            try {
                const id = req.query.id;
                const {username, password, type} = req.body;
                const obj = {};
                // 查询是否存在该用户
                const hasUser = await query(
                    "SELECT Id FROM user WHERE Id=?",
                    [id]
                )
                if (hasUser.length === 0) throw '不存在该用户';

                if (username) {
                    // 查询是否存在同用户名
                    const data = await query(
                        "SELECT Id FROM user WHERE user_name=? AND Id!=?",
                        [username, id]
                    );
                    if (data.length !== 0) throw '存在同名';
                    // 存储username
                    obj.user_name = username;
                }
                // 密码加密
                if (password) obj.password = md5(password);
                // 头像地址
                if (req.file) obj.avatar = req.file.path;
                if (type !== undefined) obj.type = type;

                let sql = "UPDATE user SET ";
                const values = [];
                for (const objKey in obj) {
                    sql += `${objKey}=?, `;
                    values.push(obj[objKey]);
                }
                // 去掉后面的 ,空格
                sql = sql.replace(/, $/, ' WHERE Id=?')
                values.push(id);

                // 执行sql，进行修改
                await query(sql, values)

                res.send({
                    code: 1,
                    msg: '修改成功'
                });
            } catch (err) {
                console.log(err)
                res.send({
                    code: 0,
                    msg: typeof err === 'string' ? err : '修改失败',
                    err: err
                })
            }
        }
    )


module.exports = router;
